package com.cskaoyan.javase.oop3.innerclazz6.static3.basic1;

/**
 * @description: 静态内部类的访问特点
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 前提:
 *  1,只要是内部类,外围类都是亲兄弟,都没有访问权限限制
 *  2,外围类和内部类对象就不会互相影响了 各干各的
 *
 * 需求:不希望依赖外围类,又不希望外部类能够访问,只能用静态内部类
 * - 静态内部类内部访问外围类
 *  必须要创建外围类对象
 *  静态成员推荐类名访问
 *  不受访问权限控制
 *
 * - 外围类访问静态内部类成员
 * 无论是什么方法,直接创建内部类对象完事
 * 不受访问权限限制
 * 如果是静态成员推荐使用类名访问
 *
 * - 外部类访问静态内部类成员
 * 这里静态内部类是一个可以独立的类
 * 唯一的区别 就是需要类的声明访问权限限制
 * 语法:
 * EnclosedClazz.InnerStaticClazz ecisc = new EnclosedClazz.InnerStaticClazz();
 *
 * - 静态内部类访问外部类成员（了解）
 * > 在静态内部类中，访问外部类成员，和在普通类中访问其他类成员别无二致
 *
 * - 静态成员，类名点直接访问
 * - 普通成员需创建对象访问
 * - 受访问权限控制
 *
 */
public class OutsideClazz { //外部类
    public static void main(String[] args) {
        //创建内部类对象
        //可以直接创建 但是它和普通类不同
        //需要告诉编译器 你这个内部类在哪里
        //EnclosedClazz.InnerClazz ic = new EnclosedClazz.InnerClazz();
        //System.out.println(ic.privateVar);
    }
}

class EnclosedClazz { //外围类
    int aEn;
    private int aEnPrivate = 10;
    static int b = 10;
    //成员方法
    public void test(){
        //这里没有静态内部类对象,需要创建
        //不受访问权限限制
    }
    public static void testStatic(){
        //需要创建外围类对象吗?
        InnerClazz innerClazz = new InnerClazz();
    }


  private  static class InnerClazz  { //静态内部类
        //虽然这个类加了static 但是你不要往静态成员考虑 这里static表示这个内部类是独立的
        //定义成员变量
        int aEn;
        private int privateVar = 100;
        private static int b = 10;
        static int c = 20;
        static final int D = 30;
        //定义成员方法
        public void test(){
            //访问外围类成员 需要外围类对象
            //思考:这里有没有外围类对象?
            //这里没有外围类对象,需要创建外围类对象
            EnclosedClazz ec = new EnclosedClazz();
            System.out.println(ec.aEn);
            System.out.println(ec.aEnPrivate);
            //思考:这里如果内部类和外围类同名变量
            //外围类的就用外围类对象方法,自己的就用this访问
            System.out.println(this.aEn); //用this增加区分度
            System.out.println(InnerClazz.b);


        }
        public static void testStatic(){}

    }
    class InnerStatic{}
}

